/**
 * VimL虚拟机基本用法示例
 * 
 * 本示例展示了VimL虚拟机的基本使用方法，是学习VimL的入门示例，包括：
 * 1. 变量定义和赋值
 * 2. 函数定义和调用
 * 3. 基本数据类型（整数、字符串）
 * 4. 简单的算术运算
 * 5. 编译和执行流程
 * 
 * 这是最适合初学者的示例，展示了完整的"编写代码→编译→执行"流程。
 * 
 * 编译和运行：
 * mkdir -p build && cd build
 * cmake .. && ninja
 * ./bin/basic_usage_example
 * 
 * 作者：VimL虚拟机项目组
 * 日期：2025-09-27
 */

#include "viml/compiler.h"
#include "viml/vm.h"
#include <iostream>

using namespace viml;

// 打印分隔线的辅助函数
void print_section(const std::string& title) {
    std::cout << "\n" << std::string(50, '-') << std::endl;
    std::cout << " " << title << std::endl;
    std::cout << std::string(50, '-') << std::endl;
}

int main() {
    try {
        // 创建编译器和虚拟机实例
        Compiler compiler;
        VM vm;
        
        std::cout << "🎉 欢迎使用VimL虚拟机！" << std::endl;
        std::cout << "本示例将演示VimL的基本功能..." << std::endl;
        
        print_section("第一步：编写VimL代码");
        
        // 这是一个简单的VimL程序
        std::string viml_code = R"(
" VimL基本用法示例
" 行首的双引号表示注释

" 1. 变量定义和赋值
let name = "VimL虚拟机"
let version = 1
let pi = 3.14

" 2. 输出变量值
echo "程序名称:", name
echo "版本号:", version
echo "圆周率:", pi

" 3. 定义一个简单的函数
function add_numbers(a, b)
    " 函数内部可以有局部变量
    let result = a + b
    echo "计算", a, "+", b, "=", result
    return result
endfunction

" 4. 调用函数
let sum = add_numbers(10, 20)
echo "函数返回值:", sum

" 5. 更复杂的计算
let x = 5
let y = 3
let calculation = x * y + sum
echo "复合计算结果:", calculation
)";
        
        std::cout << "VimL源代码：" << std::endl;
        std::cout << viml_code << std::endl;
        
        print_section("第二步：编译VimL代码");
        
        std::cout << "正在编译VimL代码..." << std::endl;
        
        // 编译VimL代码为字节码
        auto bytecode = compiler.compile(viml_code, "basic_example.vim");
        
        std::cout << "✓ 编译成功！代码已转换为虚拟机字节码" << std::endl;
        std::cout << "  编译器版本: VimL Compiler v1.0" << std::endl;
        std::cout << "  源文件: basic_example.vim" << std::endl;
        
        print_section("第三步：执行字节码");
        
        std::cout << "正在虚拟机中执行字节码..." << std::endl;
        std::cout << "\n--- 程序输出 ---" << std::endl;
        
        // 在虚拟机中执行字节码
        Value result = vm.execute(bytecode);
        
        std::cout << "\n--- 执行完成 ---" << std::endl;
        std::cout << "✓ 程序执行成功！" << std::endl;
        std::cout << "  最终返回值: " << result.debug_string() << std::endl;
        
        print_section("第四步：检查执行结果");
        
        // 检查一些全局变量的值
        try {
            auto name_value = vm.get_global("name");
            auto sum_value = vm.get_global("sum");
            auto calculation_value = vm.get_global("calculation");
            
            std::cout << "全局变量检查：" << std::endl;
            std::cout << "  name = " << name_value.debug_string() << std::endl;
            std::cout << "  sum = " << sum_value.debug_string() << std::endl;
            std::cout << "  calculation = " << calculation_value.debug_string() << std::endl;
            
        } catch (const std::exception& e) {
            std::cout << "全局变量访问: " << e.what() << std::endl;
        }
        
        print_section("VimL基本功能验证");
        
        std::cout << "✓ 变量定义和赋值：正常" << std::endl;
        std::cout << "✓ 函数定义和调用：正常" << std::endl;
        std::cout << "✓ 算术运算：正常" << std::endl;
        std::cout << "✓ 字符串处理：正常" << std::endl;
        std::cout << "✓ 编译流程：正常" << std::endl;
        std::cout << "✓ 执行流程：正常" << std::endl;
        
        std::cout << "\n🎉 VimL虚拟机基本功能完全正常！" << std::endl;
        
        print_section("学习建议");
        
        std::cout << "📚 学习路径建议：" << std::endl;
        std::cout << "1. 掌握基本语法（本示例）" << std::endl;
        std::cout << "2. 学习控制结构（if/while语句）" << std::endl;
        std::cout << "3. 探索数据结构（字典和列表）" << std::endl;
        std::cout << "4. 了解内置函数和高级特性" << std::endl;
        std::cout << "5. 查看其他example目录中的示例" << std::endl;
        
        std::cout << "\n📁 相关示例文件：" << std::endl;
        std::cout << "- advanced/string_operations_example.cpp : 字符串操作" << std::endl;
        std::cout << "- integration/comprehensive_system_test.cpp : 系统集成测试" << std::endl;
        std::cout << "- debugging/ast_parsing_example.cpp : AST解析演示" << std::endl;
        
        return 0;
        
    } catch (const std::exception& e) {
        std::cout << "\n❌ 程序执行过程中发生错误: " << e.what() << std::endl;
        std::cout << "\n🔧 故障排除建议：" << std::endl;
        std::cout << "1. 检查VimL代码语法是否正确" << std::endl;
        std::cout << "2. 确认虚拟机和编译器已正确初始化" << std::endl;
        std::cout << "3. 查看详细错误信息进行调试" << std::endl;
        return 1;
    }
}